/*global pi, self, XMLHttpRequest, ActiveXObject */

// web版的资源管理器模块
// 资源加载方法
// pi.res.load(path, type, callback)
// 参数type为加载类型
// 参数callback为回调函数，接口为: callback(result), 如果result中有error属性，则表示错误，其中error的值为整数表示错误类型，reason属性描述原因

pi.mod.define('pi.res', function(pi) {
	"use strict";
	// 定义模块
	var module = {};

	// 解析ArrayBuffer，回调的参数为：ArrayBuffer
	module.BIN = 'bin';
	// 解析string，回调的参数为：string
	module.STR = 'str';
	// 解析json对象，回调的参数为：json对象
	module.JSON = 'json';

	// 模块资源加载方法
	module.load = function(path, type, callback) {
		var ref, xhr = (self.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
		if (type === module.BIN) {
			xhr.responseType = 'arraybuffer';
		}
		xhr.onreadystatechange = function(event) {
			if (xhr.readyState === 4) {
				pi.lang.clearTimeout(ref);
				if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
					if (type === module.STR) {
						callback(xhr.responseText);
					} else if (type === module.JSON) {
						callback(JSON.parse(xhr.responseText));
					} else {
						callback(xhr.response);
					}
				} else {
					callback({
						error: -10,
						reason: "error status: " + xhr.status + xhr.statusText
					});
				}
			}
		};
		path = (path.indexOf("?") > 0) ? path + "&" + Math.random() : path + "?" + Math.random();
		xhr.open('GET', path, true);
		xhr.send();
		// 处理超时，默认3秒
		ref = pi.lang.setTimeout(function() {
			xhr.abort();
			callback({
				error: -11,
				reason: "timeout"
			});
		},
		3000);
	};
	// 模块多资源加载方法
	module.loads = function(pathTypeArray, callback) {
		var resultFun = function(result) {
			var i;
			for (i = result.length - 1; i >= 0; i--) {
				if (result[i].error) {
					result.error = result[i].error;
					result.reason = result[i].reason;
					break;
				}
			}
			callback(result);
		};
		pi.async.mapReduce(pathTypeArray, function(pathType, fun) {
			module.load(pathType[0], pathType[1], fun);
		},
		resultFun);
	};

	return module;
});